/*********************************************************************************************************
* 模块名称：Main.c
* 摘    要：主文件，包含软硬件初始化函数和main函数
* 当前版本：1.0.0
* 作    者：
* 完成日期：2021年07月01日
* 内    容：
* 注    意：注意勾选Options for Target 'Target1'->Code Generation->Use MicroLIB，否则printf无法使用
**********************************************************************************************************
* 取代版本：
* 作    者：
* 完成日期：
* 修改内容：
* 修改文件：
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "Main.h"
#include "gd32f30x_conf.h"
#include "SysTick.h"
#include "RCU.h"
#include "NVIC.h"
#include "Timer.h"
#include "USART485.h"
#include "LED.h"
#include "RTC.h"
#include "Key.h"
#include "DAC.h"
#include "ADC.h"
#include "I2C.h"
#include "OLED.h"
#include "AT24Cxx.h"
#include "W25Qxx.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/
static  void  InitSoftware(void);   //初始化软件相关的模块
static  void  InitHardware(void);   //初始化硬件相关的模块
static  void  Proc2msTask(void);    //2ms处理任务
static  void  Proc10usTask(void);   //10us处理任务
static  void  Proc1SecTask(void);   //1s处理任务

/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称：InitSoftware
* 函数功能：所有的软件相关的模块初始化函数都放在此函数中
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
static  void  InitSoftware(void)
{
//    RTC_Set(2025, 5, 22, 11, 13, 15);
    OLED_Init();        //初始化OLED
    InitAT24Cxx();      //初始化AT24C32
    InitGD25QXX();      //初始化GD23QXX
}

/*********************************************************************************************************
* 函数名称：InitHardware
* 函数功能：所有的硬件相关的模块初始化函数都放在此函数中
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
static  void  InitHardware(void)
{
    SystemInit();       //系统初始化
    InitRCU();          //初始化RCU模块
    InitNVIC();         //初始化NVIC模块
    InitUART0(9600);    //初始化UART模块
    InitTimer();        //初始化Timer模块
    InitLED();          //初始化LED模块
    InitSysTick();      //初始化SysTick模块
    InitRTC();          //初始化RTC模块
    InitKey();          //初始化按键
    InitDAC();          //初始化DAC
    InitADC();          //初始化ADC
    InitI2C();          //初始化I2C
}

/*********************************************************************************************************
* 函数名称：Proc10usTask
* 函数功能：10us处理任务
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年01月10日
* 注    意：
*********************************************************************************************************/
static  void  Proc10usTask(void)
{
    if (Get10usFlag()) {     //判断10us标志状态
        LEDFlicker1(30000);  //调用闪烁函数
        ScanDMASendDelay();     //DMA发送结束延时关闭发送状态                       
        ScanResendReceive();    //发送接收到的数据
        
        Clr10usFlag();       //清除10us标志
    }
}

/*********************************************************************************************************
* 函数名称：Proc2msTask
* 函数功能：2ms处理任务
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
static  void  Proc2msTask(void)
{
    if (Get2msFlag()) {         //判断2ms标志状态
        LEDFlicker0(300);       //调用闪烁函数
        KeyScan(5);             //5次10ms调用一次按键扫描 
        
        Clr2msFlag();           //清除2ms标志
    }
}

/*********************************************************************************************************
* 函数名称：Proc1SecTask
* 函数功能：1s处理任务
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
static  void  Proc1SecTask(void)
{
    if (GetRTC1sFlag()) { //判断RTC 1s标志状态
        
        LEDFlicker2(1);   //调用LED2闪烁函数
        
        _calender_obj calender = getRTC();
//        printf("Now time: %d-%02d-%02d %02d:%02d:%02d\n", calender.w_year, calender.w_month, calender.w_day, calender.hour, calender.min, calender.sec);
//        Usart485Printf("Now time: %d-%02d-%02d %02d:%02d:%02d\n", calender.w_year, calender.w_month, calender.w_day, calender.hour, calender.min, calender.sec);
        if(calender.sec % 10 == 0){        
            printf("adcVol: %d mv", getAdcVol());
        }
        
        uint8_t showChars[50];
        sprintf((char*)showChars, "%02d-%02d %02d:%02d:%02d", calender.w_month, calender.w_day, calender.hour, calender.min, calender.sec);
		OLED_ShowString(0, 0, showChars,8);

        if(calender.sec % 3 == 0){
            AT24CxxWrite(0x55, &calender.sec, sizeof(calender.sec));
        }
        
        if(calender.sec % 5 == 0){
            W25Q64X4KErase(0);
            DelayNms(2);
            W25Q64Write(&calender.sec, 1, 0);
        }

        ClrRTC1sFlag();  //清除RTC 1s标志
    }
}

/*********************************************************************************************************
* 函数名称：main
* 函数功能：主函数
* 输入参数：void
* 输出参数：void
* 返 回 值：int
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
int main(void)
{
    InitHardware();   //初始化硬件相关函数
    InitSoftware();   //初始化软件相关函数

    printf("Init System has been finished.\r\n");  //打印系统状态
    Usart485Printf("Init System has been finished..\r\n");  //打印系统状态
    uint8_t checkResult = CheckAT24Cxx();
    uint8_t showChars[16];
    sprintf((char*)showChars, "checkResult: %d", checkResult);
    OLED_ShowString(0, 1, showChars, 8);
    DelayNms(200);
    printf("bit0-bit16 id: %x\r\n", W25Q64ReadJEDEID());
    DelayNms(200);
    printf("Device id: %x\r\n", W25Q64ReadDeviceID());
    DelayNms(200);
    
    while (1) {
        Proc10usTask(); //10us处理任务
        Proc2msTask();  //2ms处理任务
        Proc1SecTask(); //1s处理任务
    }
}

void Key1PressCallBack(void)
{
    //按下按键操作
    uint8_t data = 0;
    AT24CxxRead(0x55, &data, 1);
    
    uint8_t showChars[16];
    sprintf((char*)showChars, "readATData: %02d", data);
    
    OLED_ShowString(0, 2, showChars, 8);
}


void Key2PressCallBack(void)
{
    //按下按键操作
    uint8_t data = 0;
    W25Q64Read(&data, 1, 0);
    
    uint8_t showChars[16];
    sprintf((char*)showChars, "readWQData: %02d", data);
    
    OLED_ShowString(0, 3, showChars, 8);
}
